﻿using GDM.Hogar.Aplicacion.Formularios.Actividades;
using GDM.Hogar.Aplicacion.Formularios.Agentes;
using GDM.Hogar.Aplicacion.Formularios.Configuracion;
using GDM.Hogar.Aplicacion.Formularios.Estadisticas;
using GDM.Hogar.Aplicacion.Formularios.Integrantes;
using GDM.Hogar.Aplicacion.Formularios.Mercaderia;
using GDM.Hogar.Aplicacion.Formularios.ParteDiarioComedor;
using GDM.Hogar.Aplicacion.Formularios.ParteQuincenalPersonal;
using GDM.Hogar.Aplicacion.Formularios.Planillas;
using GDM.Hogar.Aplicacion.Formularios.Seguridad;
using GDM.Hogar.Aplicacion.Formularios.Usuarios;
using GDM.Hogar.Aplicacion.Reportes;
using GDM.Hogar.Entidades.Enums;
using GDM.Hogar.Managers;
using GDM.Hogar.Managers.Contratos;
using System;
using System.Drawing;
using System.Linq;
using System.Windows.Forms;
using GDM.Hogar.Soporte;

namespace GDM.Hogar.Aplicacion.Formularios
{
    public partial class FrmPrincipal
#if DEBUG
 : AdaptadorFrm
#else
        : FrmBase
#endif
    {
        private const int WmNclbuttondblclk = 0x00A3;
        private FrmCambiarContraseña _frmCambiarContraseña;
        private FrmConsultaActividades _frmConsultaActividades;
        private FrmConsultaAgentes _frmConsultaAgentes;
        private FrmConsultaIntegrantes _frmConsultaIntegrantes;
        private FrmConsultaUsuarios _frmConsultaUsuarios;
        private FrmConsultaRemitos _frmConsultaRemitos;
        private FrmConfiguracion _frmConfiguracion;
        private FrmPlanillas _frmPlanillas;
        private FrmLogueo _frmLogueo;
        private FrmReporteEstadisticas _frmEstadisticas;
        private FrmConsultaParteDiarioComedor _frmConsultaParteDiarioComedor;
        private FrmConsultaParteQuincenalPersonal _frmConsultaParteQuincenalPersonal;
        private Reportes.FrmParteDiarioComedor _frmReporteParteDiarioComedor;
        private Reportes.FrmParteQuincenalPersonal _frmReporteParteQuincenalPersonal;
        private bool _usuarioLogueado;

        protected override string Titulo
        {
            get { return ""; }
        }

        #region [Metodos Publicos]

        public FrmPrincipal()
        {
            InitializeComponent();
            _usuarioLogueado = false;
            InicializarMenu();
        }

        public override Color BackColor
        {
            get
            {
                return Color.FromArgb(184, 205, 214);
            }
            set
            {
                base.BackColor = value;
            }
        }

        protected override void WndProc(ref Message m)
        {
            if (m.Msg == WmNclbuttondblclk)
            {
                m.Result = IntPtr.Zero;
                return;
            }
            base.WndProc(ref m);
        }

        #endregion [Metodos Publicos]

        #region [Metodos Privados]

        private void ActualizarUltimoAcceso()
        {
            var manager = ContenedorIoC.Resolver<IUsuarioManager>();
            manager.ActualizarUltimoAcceso(ContextoUsuario.UsuarioId);
        }

        private void btnIngresar_Click(object sender, EventArgs e)
        {
            if (!_usuarioLogueado)
            {
                var delFrmCerrado = new FormClosedEventHandler(LogueoFrmClosed);
                _frmLogueo = AbrirOActivarFormulario(_frmLogueo, delFrmCerrado);
            }
            else
            {
                CerrarSesionUsuario();
                btnIngresar_Click(null, null);
            }
        }

        private void CerrarSesionUsuario()
        {
            MdiChildren.OfType<Form>().ToList().ForEach(x => x.Close());
            _usuarioLogueado = false;
            tsGeneral.Visible = false;
            //ibNotificaciones.Visible = false;
            //MostrarCantNotificaciones(false);
            btnIngresar.Visible = false;
            lblBienvenida.Text = @"";
            lblBienvenida.TextAlign = ContentAlignment.MiddleRight;
            pbUsuario.Visible = false;
            lblUltimoAcceso.Visible = false;
            lblRol.Visible = false;
        }

        private void FrmMain_Load(object sender, EventArgs e)
        {
            InicializarFormulario();
            MostrarDatosDelHogar();
            btnIngresar_Click(null, null);
        }

        private void InicializarFormulario()
        {
            Left = Top = 0;
            Width = Screen.PrimaryScreen.WorkingArea.Width;
            Height = Screen.PrimaryScreen.WorkingArea.Height;
            foreach (Control ctl in Controls)
            {
                try
                {
                    var ctlMdi = (MdiClient)ctl;
                    ctlMdi.BackColor = BackColor;
                    //ctlMdi.Paint += PaintClientBg;
                    //ctlMdi.SizeChanged += SizeClientBg;
                }
                catch (InvalidCastException ex)
                {
                }
            }
            //ttInfo.SetToolTip(ibNotificaciones, "Notificaciones");
        }

        private void InicializarMenu()
        {
            var renderer = new MyRenderer();
            tsGeneral.Renderer = renderer;
            tsGeneral.Visible = false;
        }

        private void IniciarSesionUsuario()
        {
            MostrarDatosPrincipales();
            _usuarioLogueado = true;
            btnIngresar.Text = @"Cerrar Sesion";
            btnIngresar.Visible = true;
        }

        private void LogueoFrmClosed(object sender, FormClosedEventArgs e)
        {
            var frm = sender as FrmLogueo;
            if (frm == null || !frm.UsuarioAutenticado)
            {
                Application.Exit();
                return;
            }

            IniciarSesionUsuario();
        }

        //private void MostrarCantNotificaciones(bool mostrar)
        //{
        //    pbCntNotificaciones.Visible = mostrar;
        //    lblCantNotificaciones.Visible = mostrar;
        //    lblCantNotificaciones.BringToFront();
        //}

        private void MostrarDatosDelHogar()
        {
            var manager = ContenedorIoC.Resolver<IHogarManager>();
            var hogar = manager.ObtenerHogar();
            SetearDatosDelHogar(hogar);
        }

        private void MostrarDatosDelUsuario()
        {
            lblBienvenida.Text = ContextoUsuario.NombreUsuario;
            lblBienvenida.TextAlign = ContentAlignment.MiddleLeft;
            pbUsuario.Left = lblBienvenida.Left - pbUsuario.Width;
            lblBienvenida.Visible = true;
            lblRol.Text = Enum.GetName(typeof(Rol), ContextoUsuario.RolId);
            lblRol.Visible = true;
            pbUsuario.Visible = true;
            //ibNotificaciones.Visible = true;
            lblUltimoAcceso.Text = String.Format("Ultimo acceso : {0}", String.Format("{0:g}", ContextoUsuario.UltimoAcceso));
            lblUltimoAcceso.Visible = true;
        }

        private void MostrarDatosPrincipales()
        {
            MostrarDatosDelUsuario();
            MostrarMenuUsuario();
            ActualizarUltimoAcceso();
        }

        private void MostrarMenuUsuario()
        {
            var rol = ContextoUsuario.RolId;

            tsbIntegrantes.Available = rol != (int)Rol.Administrador;
            toolStripSeparator1.Visible = tsbIntegrantes.Available;

            tsbAgentes.Available = rol == (int)Rol.Responsable || rol == (int)Rol.Administrativo;
            toolStripSeparator2.Visible = tsbAgentes.Available;

            tsbActividades.Available = rol != (int)Rol.Docente && rol != (int)Rol.Administrador;
            toolStripSeparator3.Visible = tsbActividades.Available;

            //tsbAsistencias.Available = rol == (int)Rol.Administrativo || rol == (int)Rol.Docente || rol == (int)Rol.Coordinador;
            //toolStripSeparator4.Visible = tsbAsistencias.Available;

            //tsbActividadesInstitucionales.Available = rol == (int)Rol.Administrativo || rol == (int)Rol.Responsable || rol == (int)Rol.Coordinador;
            //toolStripSeparator5.Visible = tsbActividadesInstitucionales.Available;

            tsbParteDiarioComedor.Available = rol == (int)Rol.Administrativo || rol == (int)Rol.Coordinador || rol == (int)Rol.Responsable;
            toolStripSeparator6.Visible = tsbParteDiarioComedor.Available;

            tsbParteDiarioPersonal.Available = rol == (int)Rol.Administrativo || rol == (int)Rol.Responsable;
            toolStripSeparator13.Visible = tsbParteDiarioPersonal.Available;

            //tsbRemitos.Available = rol == (int)Rol.Administrativo || rol == (int)Rol.Coordinador;
            //toolStripSeparator7.Visible = tsbRemitos.Available;

            tsbEstadisticas.Available = rol == (int)Rol.Profesional;
            toolStripSeparator8.Visible = tsbEstadisticas.Available;

            tsbPlanillas.Available = rol == (int)Rol.Administrativo;
            toolStripSeparator9.Visible = tsbPlanillas.Available;

            tsbConfiguracion.Available = rol == (int)Rol.Administrador;
            toolStripSeparator10.Visible = tsbConfiguracion.Available;

            tsbUsuarios.Available = rol == (int)Rol.Administrador;
            toolStripSeparator11.Visible = tsbUsuarios.Available;

            tsbReportes.Available = rol == (int)Rol.Administrativo || rol == (int)Rol.Coordinador || rol == (int)Rol.Responsable;
            toolStripSeparator14.Visible = tsbReportes.Available;

            tsGeneral.Visible = true;
        }

        private void SetearDatosDelHogar(Entidades.Hogar hogar)
        {
            var contextoHogar = new ContextoHogar(hogar.HogarId, hogar.Nombre, hogar.Telefono, hogar.Descripcion, hogar.Cooperativa);
            ContextoHogarManager.Instancia.ContextoHogar = contextoHogar;

            lblHogar.Text = hogar.Nombre.ToUpper();
            lblDatosHogar.Text = hogar.Direccion;
            lblTelefono.Text = hogar.Telefono;
        }

        #endregion [Metodos Privados]

        private void tsbPlanillas_Click(object sender, EventArgs e)

        {
            _frmPlanillas = AbrirOActivarFormulario(_frmPlanillas);
        }

        private void tsbConfiguracion_Click(object sender, EventArgs e)
        {
            _frmConfiguracion = AbrirOActivarFormulario(_frmConfiguracion, action: frm => frm.OnHogarActualizado = SetearDatosDelHogar);
        }

        private void tsbCambiarContraseña_Click(object sender, EventArgs e)
        {
            _frmCambiarContraseña = AbrirOActivarFormulario(_frmCambiarContraseña);
        }

        private void tsbUsuarios_Click(object sender, EventArgs e)
        {
            _frmConsultaUsuarios = AbrirOActivarFormulario(_frmConsultaUsuarios);
        }

        private void tsbRemitos_Click(object sender, EventArgs e)
        {
            _frmConsultaRemitos = AbrirOActivarFormulario(_frmConsultaRemitos);
        }

        private void tsbIntegrantes_Click(object sender, EventArgs e)
        {
            _frmConsultaIntegrantes = AbrirOActivarFormulario(_frmConsultaIntegrantes);
        }

        private void tsbAgentes_Click(object sender, EventArgs e)
        {
            _frmConsultaAgentes = AbrirOActivarFormulario(_frmConsultaAgentes);
        }

        private void tsbActividades_Click(object sender, EventArgs e)
        {
            _frmConsultaActividades = AbrirOActivarFormulario(_frmConsultaActividades);
        }

        private void tsbParteDiarioComedor_Click(object sender, EventArgs e)
        {
            _frmConsultaParteDiarioComedor = AbrirOActivarFormulario(_frmConsultaParteDiarioComedor);
        }

        private void tsbParteDiarioPersonal_Click(object sender, EventArgs e)
        {
            _frmConsultaParteQuincenalPersonal = AbrirOActivarFormulario(_frmConsultaParteQuincenalPersonal);
        }

        private void tsmiParteDiarioComedor_Click(object sender, EventArgs e)
        {
            _frmReporteParteDiarioComedor = AbrirFormularioModal(_frmReporteParteDiarioComedor, action: frm => frm.ConFiltro = true);
        }

        private void tsmiParteQuincenalPersonal_Click(object sender, EventArgs e)
        {
            _frmReporteParteQuincenalPersonal = AbrirFormularioModal(_frmReporteParteQuincenalPersonal, action: frm => frm.ConFiltro = true);
        }

        private void tsbEstadisticas_Click(object sender, EventArgs e)
        {
            _frmEstadisticas = AbrirOActivarFormulario(_frmEstadisticas);
        }
    }

    public class MyRenderer : ToolStripProfessionalRenderer
    {
        protected override void OnRenderMenuItemBackground(ToolStripItemRenderEventArgs e)
        {
            var rc = new Rectangle(Point.Empty, e.Item.Size);
            e.Item.ForeColor = Color.DimGray; //e.Item.Selected ? Color.White : Color.DimGray;
            var c = e.Item.Selected ? Color.FromArgb(194, 224, 255) /*Color.FromArgb(37, 175, 178)*/ : Color.FromArgb(247, 247, 248);
            using (var brush = new SolidBrush(c))
            {
                e.Graphics.FillRectangle(brush, rc);
            }
        }
    }
}